import { Message } from 'element-ui'
import store from '@/store'
// 之前axios二次封装
// import axios from 'axios'
// axios.defaults.baseURL = 'xxxxx'
// export default axios

// 升级版axios封装
import axios from 'axios'
import router from '@/router'
import { getTimeStamp } from './auth'
const Timeout = 3600
// 实例化
// 如果需要调用不同的后台，可以创建多个实例对象，每个对象对应一台服务器地址
const service = axios.create({
  // 执行 npm run dev => .env.development => /api => 跨域代理
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 设置超时时间
})
// 配置拦截器(请求 + 相应)   发送请求 -> 请求拦截器 -> 服务器处理请求 -> 响应拦截器 -> 浏览器接受
// 实例对象.拦截器.请求.使用(成功回调，失败回调)
service.interceptors.request.use(config => {
  // config就是发起请求的配置，要想请求能发出去必须return config参数
  // headers中添加token(有token的时候添加，登录的时候没有token所以不用添加)
  if (store.getters.token) {
    if (isCheckTimeout()) {
      store.dispatch('user/logout') // 清除用户信息
      router.push('/login')
      return Promise.reject(new Error('登陆异常，清联系管理员'))
    }
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})
// 实例对象.拦截器.响应.使用()
service.interceptors.response.use(
  response => {
    // 响应成功
    // response就是axios处理后的结果
    // response.data就是后台返回的结果
    // response.data.data页面需要的数据
    const { success, message, data } = response.data
    if (success) {
      return data
    } else {
      // 1.提示错误消息
      Message.error(message)
      // 2.只要是失败状态，就应该返回一个失败的promise对象 -> Promise.reject(错误对象)
      return Promise.reject(new Error(message))
    }
  },

  error => {
    // 响应失败：error就是axios处理后的错误对象
    if (error.response?.data?.code === 10002) {
      // 当等于10002的时候 表示 后端告诉我token超时了
      // 1.清空登录
      store.dispatch('user/logout')
      // 2.跳转登录页
      router.push('/login')
    } else {
      // 提示用户 error对象是后台返回的错误对象，message属性是error对象上的错误提示属性
      Message.error(error.message)
    }
    // 返回promise的错误对象
    return Promise.reject(error)
  })
function isCheckTimeout() {
  const currentTime = Date.now() // 当前时间戳
  const timestamp = getTimeStamp() // 缓存时间戳
  return (currentTime - timestamp) / 1000 > Timeout
}
// 向外暴露service实例
export default service

